﻿//GuiTrader.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Xaml
{
	using System;
	using System.Collections.Generic;

	using Ecng.Common;
	using Ecng.Serialization;
	using Ecng.Xaml;

	using StockSharp.Logging;
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Синхронизованный шлюз. Оборачивает объект <see cref="ITrader"/> обычного шлюза для того, чтобы все события приходили в GUI потоке.
	/// </summary>
	/// <typeparam name="T">Тип шлюза, который необходимо синхронизовать.</typeparam>
	public class GuiTrader<T> : BaseLogReceiver<ITrader>, ITrader
		where T : ITrader
	{
		/// <summary>
		/// Создать синхронизованный шлюз.
		/// </summary>
		/// <param name="trader">Шлюз, который необходимо обернуть в <see cref="GuiTrader{T}"/>.</param>
		public GuiTrader(T trader)
		{
			Trader = trader;
		}

		private T _trader;

		/// <summary>
		/// Несинхронизованный объект шлюза.
		/// </summary>
		public T Trader
		{
			get { return _trader; }
			private set
			{
				if (value.IsNull())
					throw new ArgumentNullException();

				_trader = value;

				Trader.NewPortfolios += NewPortfoliosHandler;
				Trader.PortfoliosChanged += PortfoliosChangedHandler;
				Trader.NewPositions += NewPositionsHandler;
				Trader.PositionsChanged += PositionsChangedHandler;
				Trader.NewSecurities += NewSecuritiesHandler;
				Trader.SecuritiesChanged += SecuritiesChangedHandler;
				Trader.NewTrades += NewTradesHandler;
				Trader.NewMyTrades += NewMyTradesHandler;
				Trader.NewOrders += NewOrdersHandler;
				Trader.OrdersChanged += OrdersChangedHandler;
				Trader.OrdersRegisterFailed += OrdersRegisterFailedHandler;
				Trader.OrdersCancelFailed += OrdersCancelFailedHandler;
				Trader.NewStopOrders += NewStopOrdersHandler;
				Trader.StopOrdersChanged += StopOrdersChangedHandler;
				Trader.StopOrdersRegisterFailed += StopOrdersRegisterFailedHandler;
				Trader.StopOrdersCancelFailed += StopOrdersCancelFailedHandler;
				Trader.NewMarketDepths += NewMarketDepthsHandler;
				Trader.MarketDepthsChanged += MarketDepthsChangedHandler;
				Trader.NewOrderLogItems += NewOrderLogItemsHandler;
				Trader.Connected += ConnectedHandler;
				Trader.Disconnected += DisconnectedHandler;
				Trader.ConnectionError += ConnectionErrorHandler;
				Trader.NewDataExported += NewDataExportedHandler;
				Trader.ProcessDataError += ProcessDataErrorHandler;
				Trader.MarketTimeChanged += MarketTimeChangedHandler;
			}
		}

		#region NewPortfolios

		/// <summary>
		/// Событие появления новых портфелей.
		/// </summary>
		public event Action<IEnumerable<Portfolio>> NewPortfolios;

		private void NewPortfoliosHandler(IEnumerable<Portfolio> portfolios)
		{
			AddGuiAction(() => NewPortfolios.SafeInvoke(portfolios));
		}

		#endregion

		#region PortfoliosChanged

		/// <summary>
		/// Событие изменения параметров портфелей.
		/// </summary>
		public event Action<IEnumerable<Portfolio>> PortfoliosChanged;

		private void PortfoliosChangedHandler(IEnumerable<Portfolio> portfolios)
		{
			AddGuiAction(() => PortfoliosChanged.SafeInvoke(portfolios));
		}

		#endregion

		#region NewPositions

		/// <summary>
		/// Событие появления новых позиций.
		/// </summary>
		public event Action<IEnumerable<Position>> NewPositions;

		private void NewPositionsHandler(IEnumerable<Position> positions)
		{
			AddGuiAction(() => NewPositions.SafeInvoke(positions));
		}

		#endregion

		#region PositionsChanged

		/// <summary>
		/// Событие изменения параметров позиций.
		/// </summary>
		public event Action<IEnumerable<Position>> PositionsChanged;

		private void PositionsChangedHandler(IEnumerable<Position> positions)
		{
			AddGuiAction(() => PositionsChanged.SafeInvoke(positions));
		}

		#endregion

		#region NewSecurities

		/// <summary>
		/// Событие появления новых инструментов.
		/// </summary>
		public event Action<IEnumerable<Security>> NewSecurities;

		private void NewSecuritiesHandler(IEnumerable<Security> securities)
		{
			AddGuiAction(() => NewSecurities.SafeInvoke(securities));
		}

		#endregion

		#region SecuritiesChanged

		/// <summary>
		/// Событие изменения параметров инструментов.
		/// </summary>
		public event Action<IEnumerable<Security>> SecuritiesChanged;

		private void SecuritiesChangedHandler(IEnumerable<Security> securities)
		{
			AddGuiAction(() => SecuritiesChanged.SafeInvoke(securities));
		}

		#endregion

		#region NewTrades

		/// <summary>
		/// Событие появления всех новых сделок.
		/// </summary>
		public event Action<IEnumerable<Trade>> NewTrades;

		private void NewTradesHandler(IEnumerable<Trade> trades)
		{
			AddGuiAction(() => NewTrades.SafeInvoke(trades));
		}

		#endregion

		#region NewMyTrades

		/// <summary>
		/// Событие появления собственных новых сделок.
		/// </summary>
		public event Action<IEnumerable<MyTrade>> NewMyTrades;

		private void NewMyTradesHandler(IEnumerable<MyTrade> trades)
		{
			AddGuiAction(() => NewMyTrades.SafeInvoke(trades));
		}

		#endregion

		#region NewOrders

		/// <summary>
		/// Событие появления новых заявок.
		/// </summary>
		public event Action<IEnumerable<Order>> NewOrders;

		private void NewOrdersHandler(IEnumerable<Order> orders)
		{
			AddGuiAction(() => NewOrders.SafeInvoke(orders));
		}

		#endregion

		#region OrdersChanged

		/// <summary>
		/// Событие изменения состояния заявок (снята, удовлетворена).
		/// </summary>
		public event Action<IEnumerable<Order>> OrdersChanged;

		private void OrdersChangedHandler(IEnumerable<Order> orders)
		{
			AddGuiAction(() => OrdersChanged.SafeInvoke(orders));
		}

		#endregion

		#region OrdersRegisterFailed

		/// <summary>
		/// Событие об ошибках, связанных с регистрацией заявок.
		/// </summary>
		public event Action<IEnumerable<OrderFail>> OrdersRegisterFailed;

		private void OrdersRegisterFailedHandler(IEnumerable<OrderFail> fails)
		{
			AddGuiAction(() => OrdersRegisterFailed.SafeInvoke(fails));
		}

		#endregion

		#region OrdersCancelFailed

		/// <summary>
		/// Событие об ошибках, связанных со снятием заявок.
		/// </summary>
		public event Action<IEnumerable<OrderFail>> OrdersCancelFailed;

		private void OrdersCancelFailedHandler(IEnumerable<OrderFail> fails)
		{
			AddGuiAction(() => OrdersCancelFailed.SafeInvoke(fails));
		}

		#endregion

		#region NewStopOrders

		/// <summary>
		/// Событие появления новых стоп-заявок.
		/// </summary>
		public event Action<IEnumerable<Order>> NewStopOrders;

		private void NewStopOrdersHandler(IEnumerable<Order> orders)
		{
			AddGuiAction(() => NewStopOrders.SafeInvoke(orders));
		}

		#endregion

		#region StopOrdersChanged

		/// <summary>
		/// Событие появления новых стоп-заявок.
		/// </summary>
		public event Action<IEnumerable<Order>> StopOrdersChanged;

		private void StopOrdersChangedHandler(IEnumerable<Order> orders)
		{
			AddGuiAction(() => StopOrdersChanged.SafeInvoke(orders));
		}

		#endregion

		#region StopOrdersRegisterFailed

		/// <summary>
		/// Событие об ошибках, связанных с регистрацией стоп-заявок.
		/// </summary>
		public event Action<IEnumerable<OrderFail>> StopOrdersRegisterFailed;

		private void StopOrdersRegisterFailedHandler(IEnumerable<OrderFail> fails)
		{
			AddGuiAction(() => StopOrdersRegisterFailed.SafeInvoke(fails));
		}

		#endregion

		#region StopOrdersCancelFailed

		/// <summary>
		/// Событие об ошибках, связанных со снятием стоп-заявок.
		/// </summary>
		public event Action<IEnumerable<OrderFail>> StopOrdersCancelFailed;

		private void StopOrdersCancelFailedHandler(IEnumerable<OrderFail> fails)
		{
			AddGuiAction(() => StopOrdersCancelFailed.SafeInvoke(fails));
		}

		#endregion

		#region NewMarketDepths

		/// <summary>
		/// Событие появления новых стаканов с котировками.
		/// </summary>
		public event Action<IEnumerable<MarketDepth>> NewMarketDepths;

		private void NewMarketDepthsHandler(IEnumerable<MarketDepth> marketDepths)
		{
			AddGuiAction(() => NewMarketDepths.SafeInvoke(marketDepths));
		}

		#endregion

		#region MarketDepthsChanged

		/// <summary>
		/// Событие изменения стаканов с котировками.
		/// </summary>
		public event Action<IEnumerable<MarketDepth>> MarketDepthsChanged;

		private void MarketDepthsChangedHandler(IEnumerable<MarketDepth> marketDepths)
		{
			AddGuiAction(() => MarketDepthsChanged.SafeInvoke(marketDepths));
		}

		#endregion

		#region NewOrderLogItems

		/// <summary>
		/// Событие появления новых записей в логе заявок.
		/// </summary>
		public event Action<IEnumerable<OrderLogItem>> NewOrderLogItems;

		private void NewOrderLogItemsHandler(IEnumerable<OrderLogItem> items)
		{
			AddGuiAction(() => NewOrderLogItems.SafeInvoke(items));
		}

		#endregion

		#region Connected

		/// <summary>
		/// Событие успешного подключения.
		/// </summary>
		public event Action Connected;

		private void ConnectedHandler()
		{
			AddGuiAction(() => Connected.SafeInvoke());
		}

		#endregion

		#region Disconnected

		/// <summary>
		/// Событие успешного отключения.
		/// </summary>
		public event Action Disconnected;

		private void DisconnectedHandler()
		{
			AddGuiAction(() => Disconnected.SafeInvoke());
		}

		#endregion

		#region ConnectionError

		/// <summary>
		/// Событие ошибки подключения (например, соединения было разорвано).
		/// </summary>
		public event Action<Exception> ConnectionError;

		private void ConnectionErrorHandler(Exception exception)
		{
			AddGuiAction(() => ConnectionError.SafeInvoke(exception));
		}

		#endregion

		#region NewDataExported

		/// <summary>
		/// Событие, сигнализирующее о новых экспортируемых данных.
		/// </summary>
		public event Action NewDataExported;

		private void NewDataExportedHandler()
		{
			AddGuiAction(() => NewDataExported.SafeInvoke());
		}

		#endregion

		#region ProcessDataError

		/// <summary>
		/// Событие, сигнализирующее об ошибке при получении или обработке новых данных с сервера.
		/// </summary>
		public event Action<Exception> ProcessDataError;

		private void ProcessDataErrorHandler(Exception exception)
		{
			AddGuiAction(() => ProcessDataError.SafeInvoke(exception));
		}

		#endregion

		#region MarketTimeChanged

		/// <summary>
		/// Событие, сигнализирующее об изменении текущего времени на биржевых площадках <see cref="ITrader.ExchangeBoards"/>.
		/// Передается разница во времени, прошедшее с последнего вызова события. Первый раз событие передает значение <see cref="TimeSpan.Zero"/>.
		/// </summary>
		public event Action<TimeSpan> MarketTimeChanged;

		private void MarketTimeChangedHandler(TimeSpan diff)
		{
			AddGuiAction(() => MarketTimeChanged.SafeInvoke(diff));
		}

		#endregion

		/// <summary>
		/// Текстовое описание шлюза.
		/// </summary>
		public string DisplayName
		{
			get { return Trader.DisplayName; }
		}

		private static void AddGuiAction(Action action)
		{
			GuiDispatcher.GlobalDispatcher.AddAction(action);
		}

		/// <summary>
		/// Получить биржевое время.
		/// </summary>
		/// <param name="exchange">Биржа.</param>
		/// <returns>Биржевое время.</returns>
		public DateTime GetMarketTime(Exchange exchange)
		{
			return Trader.GetMarketTime(exchange);
		}

		/// <summary>
		/// Список всех биржевых площадок, для которых загружены инструменты <see cref="ITrader.Securities"/>.
		/// </summary>
		public IEnumerable<ExchangeBoard> ExchangeBoards
		{
			get { return Trader.ExchangeBoards; }
		}

		/// <summary>
		/// Список всех загруженных инструментов.
		/// Вызывать необходимо после того, как пришло событие <see cref="ITrader.NewSecurities" />. Иначе будет возвращено постое множество.
		/// </summary>
		public IEnumerable<Security> Securities
		{
			get { return Trader.Securities; }
		}

		/// <summary>
		/// Получить все заявки.
		/// </summary>
		public IEnumerable<Order> Orders
		{
			get { return Trader.Orders; }
		}

		/// <summary>
		/// Получить все стоп-заявки.
		/// </summary>
		public IEnumerable<Order> StopOrders
		{
			get { return Trader.StopOrders; }
		}

		/// <summary>
		/// Получить все ошибки при регистрации заявок.
		/// </summary>
		public IEnumerable<OrderFail> OrderRegisterFails
		{
			get { return Trader.OrderRegisterFails; }
		}

		/// <summary>
		/// Получить все ошибки при снятии заявок.
		/// </summary>
		public IEnumerable<OrderFail> OrderCancelFails
		{
			get { return Trader.OrderCancelFails; }
		}

		/// <summary>
		/// Получить все сделки.
		/// </summary>
		public IEnumerable<Trade> Trades
		{
			get { return Trader.Trades; }
		}

		/// <summary>
		/// Получить все собственные сделки.
		/// </summary>
		public IEnumerable<MyTrade> MyTrades
		{
			get { return Trader.MyTrades; }
		}

		/// <summary>
		/// Получить все портфели.
		/// </summary>
		public IEnumerable<Portfolio> Portfolios
		{
			get { return Trader.Portfolios; }
		}

		/// <summary>
		/// Получить все позиции.
		/// </summary>
		public IEnumerable<Position> Positions
		{
			get { return Trader.Positions; }
		}

		/// <summary>
		/// Проверить соединение.
		/// </summary>
		public bool IsConnected
		{
			get { return Trader.IsConnected; }
		}

		/// <summary>
		/// Запущен ли экспорт. Экспорт запускается через метод <see cref="ITrader.StartExport"/>.
		/// </summary>
		public bool IsExportStarted
		{
			get { return Trader.IsExportStarted; }
		}

		/// <summary>
		/// Поддерживается ли перерегистрация заявок через метод <see cref="ITrader.ReRegisterOrder(StockSharp.BusinessEntities.Order,StockSharp.BusinessEntities.Order)"/>
		/// в виде одной транзакции.
		/// </summary>
		public bool IsSupportAtomicReRegister
		{
			get { return Trader.IsSupportAtomicReRegister; }
		}

		/// <summary>
		/// Список всех инструментов, зарегистрированных через <see cref="ITrader.RegisterSecurity"/>.
		/// </summary>
		public IEnumerable<Security> RegisteredSecurities
		{
			get { return Trader.RegisteredSecurities; }
		}

		/// <summary>
		/// Список всех инструментов, зарегистрированных через <see cref="ITrader.RegisterMarketDepth"/>.
		/// </summary>
		public IEnumerable<Security> RegisteredMarketDepths
		{
			get { return Trader.RegisteredMarketDepths; }
		}

		/// <summary>
		/// Список всех инструментов, зарегистрированных через <see cref="ITrader.RegisterTrades"/>.
		/// </summary>
		public IEnumerable<Security> RegisteredTrades
		{
			get { return Trader.RegisteredTrades; }
		}

		/// <summary>
		/// Список всех инструментов, зарегистрированных через <see cref="ITrader.RegisterOrderLog"/>.
		/// </summary>
		public IEnumerable<Security> RegisteredOrderLogs
		{
			get { return Trader.RegisteredOrderLogs; }
		}

		/// <summary>
		/// Список всех портфелей, зарегистрированных через <see cref="ITrader.RegisterPortfolio"/>.
		/// </summary>
		public IEnumerable<Portfolio> RegisteredPortfolios
		{
			get { return Trader.RegisteredPortfolios; }
		}

		/// <summary>
		/// Подключиться к торговой системе.
		/// </summary>
		public void Connect()
		{
			Trader.Connect();
		}

		/// <summary>
		/// Отключиться от торговой системы.
		/// </summary>
		public void Disconnect()
		{
			Trader.Disconnect();
		}

		/// <summary>
		/// Переподключиться к торговой системе.
		/// </summary>
		public void Reconnect()
		{
			Trader.Reconnect();
		}

		/// <summary>
		/// Получить позицию по портфелю и инструменту.
		/// </summary>
		/// <param name="portfolio">Портфель, по которому нужно найти позицию.</param>
		/// <param name="security">Инструмент, по которому нужно найти позицию.</param>
		/// <param name="depoName">Название депозитария, где находится физически ценная бумага.
		/// По-умолчанию передается пустая строка, что означает суммарную позицию по всем депозитариям.</param>
		/// <returns>Позиция.</returns>
		public Position GetPosition(Portfolio portfolio, Security security, string depoName = "")
		{
			return Trader.GetPosition(portfolio, security, depoName);
		}

		/// <summary>
		/// Получить стакан котировок.
		/// </summary>
		/// <param name="security">Инструмент, по которому нужно получить стакан.</param>
		/// <returns>Стакан котировок.</returns>
		public MarketDepth GetMarketDepth(Security security)
		{
			return Trader.GetMarketDepth(security);
		}

		/// <summary>
		/// Поддерживает ли шлюз инструмент.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>True, если шлюз поддерживает инструмент, иначе, false.</returns>
		public bool IsSupport(Security security)
		{
			return Trader.IsSupport(security);
		}

		/// <summary>
		/// Начать получать котировки (стакан) по инструменту.
		/// Значение котировок можно получить через метод <see cref="ITrader.GetMarketDepth"/>.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо начать получать котировки.</param>
		public void RegisterMarketDepth(Security security)
		{
			Trader.RegisterMarketDepth(security);
		}

		/// <summary>
		/// Остановить получение котировок по инструменту.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо остановить получение котировок.</param>
		public void UnRegisterMarketDepth(Security security)
		{
			Trader.UnRegisterMarketDepth(security);
		}

		/// <summary>
		/// Начать получать сделки (тиковые данные) по инструменту. Новые сделки будут приходить через
		/// событие <see cref="ITrader.NewTrades"/>.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо начать получать сделки.</param>
		public void RegisterTrades(Security security)
		{
			Trader.RegisterTrades(security);
		}

		/// <summary>
		/// Остановить получение сделок (тиковые данные) по инструменту.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо остановить получение сделок.</param>
		public void UnRegisterTrades(Security security)
		{
			Trader.UnRegisterTrades(security);
		}

		/// <summary>
		/// Начать получать новую информацию по портфелю.
		/// </summary>
		/// <param name="portfolio">Портфель, по которому необходимо начать получать новую информацию.</param>
		public void RegisterPortfolio(Portfolio portfolio)
		{
			Trader.RegisterPortfolio(portfolio);
		}

		/// <summary>
		/// Остановить получение новой информации по портфелю.
		/// </summary>
		/// <param name="portfolio">Портфель, по которому необходимо остановить получение новой информации.</param>
		public void UnRegisterPortfolio(Portfolio portfolio)
		{
			Trader.UnRegisterPortfolio(portfolio);
		}

		/// <summary>
		/// Начать получать лог заявок для инструмента.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо начать получать лог заявок.</param>
		public void RegisterOrderLog(Security security)
		{
			Trader.RegisterOrderLog(security);
		}

		/// <summary>
		/// Остановить получение лога заявок для инструмента.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо остановить получение лога заявок.</param>
		public void UnRegisterOrderLog(Security security)
		{
			Trader.UnRegisterOrderLog(security);
		}

		/// <summary>
		/// Начать получать новую информацию (например, <see cref="Security.LastTrade"/> или <see cref="Security.BestBid"/>) по инструменту.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо начать получать новую информацию.</param>
		public void RegisterSecurity(Security security)
		{
			Trader.RegisterSecurity(security);
		}

		/// <summary>
		/// Остановить получение новой информации.
		/// </summary>
		/// <param name="security">Инструмент, по которому необходимо остановить получение новой информации.</param>
		public void UnRegisterSecurity(Security security)
		{
			Trader.UnRegisterSecurity(security);
		}

		/// <summary>
		/// Зарегистрировать заявку на бирже.
		/// </summary>
		/// <param name="order">Заявка, содержащая информацию для регистрации.</param>
		public void RegisterOrder(Order order)
		{
			Trader.RegisterOrder(order);
		}

		/// <summary>
		/// Перерегистрировать заявку на бирже.
		/// </summary>
		/// <param name="oldOrder">Заявка, которую нужно снять.</param>
		/// <param name="newOrder">Новая заявка, которую нужно зарегистрировать.</param>
		public void ReRegisterOrder(Order oldOrder, Order newOrder)
		{
			Trader.ReRegisterOrder(oldOrder, newOrder);
		}

		/// <summary>
		/// Перерегистрировать заявку на бирже.
		/// </summary>
		/// <param name="oldOrder">Заявка, которую нужно снять и на основе нее зарегистрировать новую.</param>
		/// <param name="price">Цена новой заявки.</param>
		/// <param name="volume">Объем новой заявки.</param>
		/// <returns>Новая заявка.</returns>
		public Order ReRegisterOrder(Order oldOrder, decimal price, decimal volume)
		{
			return Trader.ReRegisterOrder(oldOrder, price, volume);
		}

		/// <summary>
		/// Отменить заявку на бирже.
		/// </summary>
		/// <param name="order">Заявка, которую нужно отменять.</param>
		public void CancelOrder(Order order)
		{
			Trader.CancelOrder(order);
		}

		/// <summary>
		/// Отменить группу заявок на бирже по фильтру.
		/// </summary>
		/// <param name="isStopOrder">True, если нужно отменить только стоп-заявки, false - если только обычный и null - если оба типа.</param>
		/// <param name="portfolio">Портфель. Если значение равно null, то портфель не попадает в фильтр снятия заявок.</param>
		/// <param name="direction">Направление заявки. Если значение равно null, то направление не попадает в фильтр снятия заявок.</param>
		/// <param name="classCode">Код класса. Если переданная строка пустая, то код не попадает в фильтр снятия заявок.</param>
		/// <param name="security">Инструмент. Если значение равно null, то инструмент не попадает в фильтр снятия заявок.</param>
		public void CancelOrders(bool? isStopOrder = null, Portfolio portfolio = null, OrderDirections? direction = null, string classCode = null, Security security = null)
		{
			Trader.CancelOrders(isStopOrder, portfolio, direction, classCode, security);
		}

		/// <summary>
		/// Запустить экспорт данных из торговой системы в программу (получение портфелей, инструментов, заявок и т.д.).
		/// </summary>
		public void StartExport()
		{
			Trader.StartExport();
		}

		/// <summary>
		/// Остановить экспорт данных из торговой системы в программу, запущенный через <see cref="ITrader.StartExport"/>.
		/// </summary>
		public void StopExport()
		{
			Trader.StopExport();
		}

		/// <summary>
		/// Перезапустить экспорт данных из торговой системы через методы <see cref="ITrader.StopExport"/> и <see cref="ITrader.StartExport"/>.
		/// </summary>
		public void ReStartExport()
		{
			Trader.ReStartExport();
		}

		/// <summary>
		/// Освободить занятые ресурсы.
		/// </summary>
		protected override void DisposeManaged()
		{
			Trader.NewSecurities -= NewSecuritiesHandler;
			Trader.SecuritiesChanged -= SecuritiesChangedHandler;
			Trader.NewPortfolios -= NewPortfoliosHandler;
			Trader.PortfoliosChanged -= PortfoliosChangedHandler;
			Trader.NewPositions -= NewPositionsHandler;
			Trader.PositionsChanged -= PositionsChangedHandler;
			Trader.NewTrades -= NewTradesHandler;
			Trader.NewMyTrades -= NewMyTradesHandler;
			Trader.NewOrders -= NewOrdersHandler;
			Trader.OrdersChanged -= OrdersChangedHandler;
			Trader.OrdersRegisterFailed -= OrdersRegisterFailedHandler;
			Trader.OrdersCancelFailed -= OrdersCancelFailedHandler;
			Trader.NewStopOrders -= NewStopOrdersHandler;
			Trader.StopOrdersChanged -= StopOrdersChangedHandler;
			Trader.StopOrdersRegisterFailed -= StopOrdersRegisterFailedHandler;
			Trader.StopOrdersCancelFailed -= StopOrdersCancelFailedHandler;
			Trader.NewMarketDepths -= NewMarketDepthsHandler;
			Trader.MarketDepthsChanged -= MarketDepthsChangedHandler;
			Trader.NewOrderLogItems -= NewOrderLogItemsHandler;
			Trader.Connected -= ConnectedHandler;
			Trader.Disconnected -= DisconnectedHandler;
			Trader.ConnectionError -= ConnectionErrorHandler;
			Trader.NewDataExported -= NewDataExportedHandler;
			Trader.ProcessDataError -= ProcessDataErrorHandler;
			Trader.MarketTimeChanged -= MarketTimeChangedHandler;

			base.DisposeManaged();
		}

		/// <summary>
		/// Загрузить настройки стратегии.
		/// </summary>
		/// <param name="storage">Хранилище настроек.</param>
		public void Load(SettingsStorage storage)
		{
		}

		/// <summary>
		/// Сохранить настройки стратегии.
		/// </summary>
		/// <param name="storage">Хранилище настроек.</param>
		public void Save(SettingsStorage storage)
		{
		}
	}
}